//
//  HBHomeViewController.swift
//  sinaWeibo
//
//  Created by Beans on 16/6/23.
//  Copyright © 2016年 iceWorks. All rights reserved.
//

import UIKit
import AFNetworking
import SVProgressHUD

let HBHomeViewControllerCellResueIdentifier = "HBHomeViewControllerCellResueIdentifier"

class HBHomeViewController: HBBaseTableViewController {

    let since_id: Int = 0
    let max_id: Int = 0

    override func viewDidLoad() {
        super.viewDidLoad()

        if isLogin {
            // 登录之后才可获取数据
            loadData()
            // 注册cell  `类型.self -> 指定类`
            tableView.registerClass(HBHomeTableViewCell.self, forCellReuseIdentifier: HBHomeViewControllerCellResueIdentifier)

            // 设置自动计算行高
            tableView.rowHeight = UITableViewAutomaticDimension
            // 设置预估行高
            tableView.estimatedRowHeight = 200

            // 添加菊花到footerView
            tableView.tableFooterView = pullUpView

            // 添加KVO, addObserver方法
            /*
            1. 观察者 -- 需要实现观察者方法
            2. keyPath属性
            3. 属性的变化
            */
//            tableView.addObserver(self, forKeyPath: "contentOffset", options: .New, context: nil)

            /*
             iOS6.0时候, UITableView加了下拉刷新
             0. 父类是UIControl
             1. UIRefreshControl 系统有默认宽高
             2, 触发的方法是ValueChanged
            */
//            refreshControl = UIRefreshControl()
//            // 出来之后刷新数据
//            refreshControl?.addTarget(self, action: "loadData", forControlEvents: .ValueChanged)

            // 封装之后
            tableView.addSubview(refreshView)
            refreshView.addTarget(self, action: "loadData", forControlEvents: .ValueChanged)

            // MARK: - 注册通知
            NSNotificationCenter.defaultCenter().addObserver(self, selector: "showPhotoBrowser:", name: kNotificationPhotoBrowser, object: nil)

        } else {
            visitorView.setupInfo(true, image: "visitordiscover_feed_image_house", message: "关注一些人, 回这里看看有什么惊喜")
        }
    }

    // 实现通知方法
    @objc private func showPhotoBrowser(noti: NSNotification) {
        guard let pic_urls = noti.userInfo!["pic_urls"] as? [HBStatusPicViewModel], indexPath = noti.userInfo!["indexPath"] as? NSIndexPath else {
            return
        }
        let flowLayout = UICollectionViewFlowLayout()
        let pictureBrowserVC = HBPictureBrowserController(collectionViewLayout: flowLayout, pic_urls: pic_urls, indexPath: indexPath)
        presentViewController(pictureBrowserVC, animated: false, completion: nil)   // 视觉考虑, 关闭modal动画为佳
    }

    // 移除通知
    deinit {
        NSNotificationCenter.defaultCenter().removeObserver(self)
    }

    // MARK: - 获取首页数据
    func loadData() {
        // 数据加载的时候, 来一个提示
        self.showLoadingView()

        /*
        since_id	false	int64	若指定此参数，则返回ID比since_id大的微博（即比since_id时间晚的微博），默认为0。
        max_id	false	int64	若指定此参数，则返回ID小于或等于max_id的微博，默认为0。
        */
        var since_id: Int = 0
        var max_id: Int = 0

        // 下拉刷新的since_id赋值
        since_id = HBStatusListViewModel.shareInstance.statusList.first?.model?.id ?? 0

        // 加载更多时, 修改max_id
        if pullUpView.isAnimating() {
            max_id = HBStatusListViewModel.shareInstance.statusList.last?.model?.id ?? 0
            if max_id != 0 {
                max_id = max_id - 1     // 由于返回id小于或等于max_id的微博, 防止重复
            }
            // sinceid 和 max_id 都有值的时候,不会返回数据
            since_id = 0        // since_id 归零
        }

        // 实现上拉加载更多
        HBStatusListViewModel.shareInstance.loadData(since_id, max_id: max_id, success: { (count) -> () in
            self.hiddenLoadingView()

            // 刷新数据
            self.tableView.reloadData()
//            // 数据加载完后, 调用系统完成刷新的方法
//            self.refreshControl?.endRefreshing()
            // 数据加载完后, 调用自定义的完成刷新的方法
            self.refreshView.endRefreshing()

            // MARK: - 提示视图 (放在菊花停转前边, 否则加载更多也会提示个数)
            if !self.pullUpView.isAnimating() {
                self.showMessageCount(count)
            }

            // 菊花停转
            self.pullUpView.stopAnimating()

            }) { () -> () in
                // 提示失败信息
                self.hiddenLoadingView("网络加载失败, 请稍后再试")
                self.pullUpView.stopAnimating()
        }
    }

    func showMessageCount(count: Int) {
        let labelH: CGFloat = 44

        let label = UILabel(frame: CGRectMake(0, 64 - labelH, kScreenWidth, labelH))    // 64 - 44
        label.backgroundColor = UIColor.orangeColor()
        if count == 0 {
            label.text = "暂无最新微博"
        } else {
            label.text = "更新了\(count)条微博"
        }
        label.textAlignment = .Center

        // 添加到view会随着tableView而滚动
//        self.view.addSubview(label)
        navigationController?.view.insertSubview(label, belowSubview: navigationController!.navigationBar)

        // 动画效果
        UIView.animateWithDuration(1.0, animations: { () -> Void in
            label.transform = CGAffineTransformMakeTranslation(0, labelH)
            }) { (_) -> Void in
                // 动画完成之后
                label.removeFromSuperview()
        }
    }

    // MARK: - UITableViewDataSource
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return HBStatusListViewModel.shareInstance.statusList.count
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier(HBHomeViewControllerCellResueIdentifier, forIndexPath: indexPath) as! HBHomeTableViewCell
        // 取消选中状态
        cell.selectionStyle = UITableViewCellSelectionStyle.None

        // 先获取model -- list里应该存放的也是HBStatusCellViewModel
        let model = HBStatusListViewModel.shareInstance.statusList[indexPath.row]
        cell.model = model
        printLog(model.model?.id)

        // 在返回最后一个 cell 的时候去加载更多数据
        if indexPath.item == HBStatusListViewModel.shareInstance.statusList.count - 1 {
            // 菊花需要手动转动
            pullUpView.startAnimating()
            // 加载数据
            loadData()
        }

        return cell
    }

//    // KVO第二步, 观察者方法
//    override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
//        let tableView = object as? UITableView
//        printLog(tableView?.contentOffset.y)
//    }

    // MARK: - 懒加载
    // 加载更多
    private lazy var pullUpView: UIActivityIndicatorView = {
        let indicator = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.WhiteLarge)
        return indicator
    }()
    // 下拉刷新
    private lazy var refreshView: HBRefreshView = HBRefreshView()
}
